package com.wantyx.creation.factory.simplefactory;

import com.wantyx.bean.database.IDataBase;
import com.wantyx.bean.database.Mysql;
import com.wantyx.bean.database.Oracle;
import lombok.extern.slf4j.Slf4j;

/**
 * 作者 : wantyx
 * 创建时间 : 2023/11/2
 * 实现功能 : 简单工厂模式，优点：能够将实例构建统一，且能够对构建的前后处理代码进行统一管理。
 *                      缺点：如果有一个新的数据库，那么就需要重新编写方法了
 */
@Slf4j
public class DataBaseFactory {

    private DataBaseFactory(){}
    public static Mysql createMysqlHandler(){
        String userName = "wantyx";
        String password = "password";
        Mysql mysql = new Mysql();
        mysql.setPassword(password);
        mysql.setUserName(userName);
        log.info("其他的关于mysql的配置信息");
        return mysql;
    }

    public static Oracle createOracleHandler(){
        String userName = "wantyx";
        String password = "password";
        Oracle oracle = new Oracle();
        oracle.setPassword(password);
        oracle.setUserName(userName);
        log.info("其他的关于oracle的配置信息");
        return oracle;
    }

    /**
     * 数据库handler构建方法，虽然能够在新的数据库来的时候，避免新写方法，但是有缺点：
     * 【缺点】这个方法如果需要差异化处理，就会出现if语句，新的数据库如果有差异化处理就不符合开闭原则
     * @param clazz 具体的某个数据库
     * @param <T> 继承IDataBase，范型
     */
    public static<T extends IDataBase> T createHandler(Class<T> clazz) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
        IDataBase iDataBase = (IDataBase) Class.forName(clazz.getName()).newInstance();
        iDataBase.setUserName("username");
        iDataBase.setPassword("password");
        log.info("如果数据库没有特殊的配置，那么就可以用这个方法进行构建");
        return (T)iDataBase;
    }
}
